import {
    AsyncStorage,
} from 'react-native';
import GitHubTrending from 'GitHubTrending';
export var FLAG_STORAGE={flag_popular:'popular',flag_trending:'trending'};
export default class DataRepository{
    constructor(flag){
        this.flag=flag;
        //标识为trending则需要实例化一个对象
        if(flag===FLAG_STORAGE.flag_trending){
            this.trending=new GitHubTrending();
        }
    }
    saveRespository(url,items,callBack){
        if(!url||!items)return;
        let wrapData={items:items,update_date:new Date().getTime()};
        // 将数据和时间保存到数据库
        AsyncStorage.setItem(url,JSON.stringify(wrapData),callBack);
    }
    fetchRepository(url){
        return new Promise((resolve,reject)=>{
            //首先获取本地的数据
            this.fetchLocalRepository(url)
            .then(result=>{
                if(result){
                    resolve(result);
                    //如果没获取到，则访问网络数据
                }else{
                    this.fetchNetRepository(url)
                        .then(result=>{
                                resolve(result); 
                        })
                        .catch(e=>{
                                reject(e);
                        })
                }
            })
            //获取本地数据发生异常报错；
            .catch(e=>{
                this.fetchNetRepository(url)
                .then(result=>{
                        resolve(result); 
                })
                .catch(e=>{
                        reject(e);
                })
            })
        })
    }
    /**
     * 获取本地的数据
     * @param {*} url 
     */
    fetchLocalRepository(url){
        return new Promise((resolve,reject)=>{
          //使用AsyncStorage获取本地数据
             AsyncStorage.getItem(url,(error,result)=>{
                 //没有错误就返回数据
                if(!error){
                    try{
                        // 将json类型的数据转换为对象
                        resolve(JSON.parse(result));
                    }catch (e){
                        reject(e);
                    }
                    //本地获取数据失败就返回错误
                }else{
                    reject(error);
                }
             })
           
        })
    }

    fetchNetRepository(url){
        return new Promise((resolve,reject)=>{
            if(this.flag===FLAG_STORAGE.flag_trending){
                 this.trending.fetchTrending(url)
                     .then(result=>{
                         if(!result){
                            reject(new Error('responseData is null'));
                            return;
                         }
                         this.saveRespository(url,result);
                         resolve(result);
                     })
            }else{
                fetch(url)
                .then(response=>response.json())
                 .catch(error=>{
                    reject(error);
                }).then(result=>{
                if(!result||!result.items){
                        reject(new Error('responseData is null'));
                        return;
                    }
                    resolve(result.items);
                    this.saveRespository(url,result.items)
                })
               
            }
        
        })
    }

    /**
     * 判断数据是否过时
     * @param {检查时间有没有过时} longTime为数据保存在数据库的时间
     * @return (boolean) 
     */
    checkData(longTime){
        return false;
        let cDate=new Date();
        let tDate=new Date();

        tDate.setTime(longTime);
        if(cDate.getMonth()!==tDate.getMonth())return false;
        if(cDate.getDay()!==tDate.getDay())return false;
        if(cDate.getHours()-tDate.getHours()>4)return false;
        return true;

    }
}